package com.ruoyi.web.controller.gcgl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.utils.uuid.ReturnUUID;
import com.ruoyi.gcgl.domain.GysptMaterialType;
import com.ruoyi.gcgl.domain.GysptWarehouse;
import com.ruoyi.gcgl.domain.GysptWarehouseEntry;
import com.ruoyi.gcgl.domain.GysptWarehouseEntryitem;
import com.ruoyi.gcgl.domain.GysptWarehouseitem;
import com.ruoyi.gcgl.domain.GysptWarehouseitemlog;
import com.ruoyi.gcgl.service.IGysptMaterialService;
import com.ruoyi.gcgl.service.IGysptMaterialTypeService;
import com.ruoyi.gcgl.service.IGysptWarehouseEntryService;
import com.ruoyi.gcgl.service.IGysptWarehouseEntryitemService;
import com.ruoyi.gcgl.service.IGysptWarehouseService;
import com.ruoyi.gcgl.service.IGysptWarehouseitemService;
import com.ruoyi.gcgl.service.IGysptWarehouseitemlogService;

/**
 * 入库单Controller
 * 
 * @author ruoyi
 * @date 2024-12-01
 */
@Controller
@RequestMapping("/gcgl/entry")
public class GysptWarehouseEntryController extends BaseController
{
    private String prefix = "gcgl/entry";

    @Autowired
    private IGysptWarehouseEntryService gysptWarehouseEntryService;
    @Autowired
    private IGysptWarehouseEntryitemService gysptWarehouseEntryitemService;
    @Autowired
    private IGysptWarehouseService gysptWarehouseService;
    @Autowired
    private IGysptMaterialTypeService gysptMaterialTypeService;
    @Autowired
    private IGysptMaterialService gysptMaterialService;
    @Autowired
    private IGysptWarehouseitemlogService gysptWarehouseitemlogService;
    @Autowired
    private IGysptWarehouseitemService gysptWarehouseitemService;

    @RequiresPermissions("gcgl:entry:view")
    @GetMapping()
    public String entry()
    {
        return prefix + "/entry";
    }

    /**
     * 查询入库单列表
     */
    @RequiresPermissions("gcgl:entry:list")
    @PostMapping("/list")
    @ResponseBody
    public TableDataInfo list(GysptWarehouseEntry gysptWarehouseEntry)
    {
        startPage();
        List<GysptWarehouseEntry> list = gysptWarehouseEntryService.selectGysptWarehouseEntryList(gysptWarehouseEntry);
        return getDataTable(list);
    }

    /**
     * 导出入库单列表
     */
    @RequiresPermissions("gcgl:entry:export")
    @Log(title = "入库单", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    @ResponseBody
    public AjaxResult export(GysptWarehouseEntry gysptWarehouseEntry)
    {
        List<GysptWarehouseEntry> list = gysptWarehouseEntryService.selectGysptWarehouseEntryList(gysptWarehouseEntry);
        ExcelUtil<GysptWarehouseEntry> util = new ExcelUtil<GysptWarehouseEntry>(GysptWarehouseEntry.class);
        return util.exportExcel(list, "入库单数据");
    }

    /**
     * 新增入库单
     */
    @GetMapping("/add")
    public String add(ModelMap mmap){
    	String entryNo = ReturnUUID.getOrderNo("E");
    	mmap.put("entryNo", entryNo);
    	mmap.put("qyriq", new Date());
        return prefix + "/add";
    }

    /**
     * 新增保存入库单
     */
    @RequiresPermissions("gcgl:entry:add")
    @Log(title = "入库单", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @ResponseBody
    public AjaxResult addSave(GysptWarehouseEntry gysptWarehouseEntry){
    	entryWareHouse(gysptWarehouseEntry);
        return toAjax(1);
    }
    
    /**
     * 添加入库单
     * @param gysptProjectTracking
     * @return
     */
    private GysptWarehouseEntry entryWareHouse(GysptWarehouseEntry gysptWarehouseEntry){
    	try {
    		gysptWarehouseEntry.setWarehouseId(gysptWarehouseEntry.getWarehouseId());
    		gysptWarehouseEntry.setStatus(1);
    		gysptWarehouseEntry.setDeleteFlag(1);
    		gysptWarehouseEntry.setUpdateUser(getLoginName());
    		gysptWarehouseEntry.setUpdateAt(new Date());
    		gysptWarehouseEntry.setCreateUser(getLoginName());
    		gysptWarehouseEntry.setCreateAt(new Date());
    		gysptWarehouseEntryService.insertGysptWarehouseEntry(gysptWarehouseEntry);
    		
    		List<GysptWarehouseEntryitem> items = new ArrayList<GysptWarehouseEntryitem>();
    		for(GysptWarehouseEntryitem item:gysptWarehouseEntry.getItems()){
    			//入库
    			GysptWarehouseEntryitem gysptWarehouseEntryitem = new GysptWarehouseEntryitem();
        		gysptWarehouseEntryitem.setWarehouseId(gysptWarehouseEntry.getWarehouseId());
    			gysptWarehouseEntryitem.setEntryId(gysptWarehouseEntry.getId());
    			gysptWarehouseEntryitem.setEntryNo(gysptWarehouseEntry.getEntryNo());
    			gysptWarehouseEntryitem.setXuh(item.getXuh());
    			gysptWarehouseEntryitem.setClbh(item.getClbh());
    			gysptWarehouseEntryitem.setClfl(item.getClfl());
    			gysptWarehouseEntryitem.setMingc(item.getMingc());
    			gysptWarehouseEntryitem.setClpp(item.getClpp());
    			gysptWarehouseEntryitem.setGuig(item.getGuig());
    			gysptWarehouseEntryitem.setDanw(item.getDanw());
    			gysptWarehouseEntryitem.setShul(item.getShul());
    			gysptWarehouseEntryitem.setZdjine(item.getZdjine());
    			gysptWarehouseEntryitem.setMemo(item.getMemo()==null?"":item.getMemo());
    			gysptWarehouseEntryitem.setStatus(1);
    			gysptWarehouseEntryitem.setDeleteFlag(1);
    			gysptWarehouseEntryitem.setUpdateUser(getLoginName());
    			gysptWarehouseEntryitem.setUpdateAt(new Date());
    			gysptWarehouseEntryitem.setCreateUser(getLoginName());
    			gysptWarehouseEntryitem.setCreateAt(new Date());
    			gysptWarehouseEntryitemService.insertGysptWarehouseEntryitem(gysptWarehouseEntryitem);
    			items.add(gysptWarehouseEntryitem);
    			
    			//入库明细
    			GysptWarehouseitem warehouseitem = new GysptWarehouseitem();
    			warehouseitem.setWarehouseId(gysptWarehouseEntry.getWarehouseId());
    			warehouseitem.setClfl(item.getClfl());
    			warehouseitem.setClbh(item.getClbh());
    			warehouseitem.setMingc(item.getMingc());
    			warehouseitem.setClpp(item.getClpp());
    			warehouseitem.setGuig(item.getGuig());
    			warehouseitem.setDanw(item.getDanw());
    			warehouseitem.setKucshul(item.getShul());
    			warehouseitem.setLinglCount("0");
    			warehouseitem.setFeilCount("0");
    			warehouseitem.setZdjine(item.getZdjine());
    			warehouseitem.setStatus(0);
    			warehouseitem.setDeleteFlag(1);
    			warehouseitem.setUpdateUser(getLoginName());
    			warehouseitem.setUpdateAt(new Date());
    			warehouseitem.setCreateUser(getLoginName());
    			warehouseitem.setCreateAt(new Date());
    			gysptWarehouseitemService.insertGysptWarehouseitem(warehouseitem);
    			
    			//插入日志
    			whlogEntry(warehouseitem, gysptWarehouseEntry.getId(), gysptWarehouseEntry.getEntryNo(), item.getShul());
        	}
    		gysptWarehouseEntry.setItems(items);
    		
		} catch (Exception e) {
			e.printStackTrace();
			return gysptWarehouseEntry;
		}
    	
		return gysptWarehouseEntry;
    }

    /**
     * 修改入库单
     */
    @RequiresPermissions("gcgl:entry:edit")
    @GetMapping("/edit/{id}")
    public String edit(@PathVariable("id") Long id, ModelMap mmap)
    {
        GysptWarehouseEntry gysptWarehouseEntry = gysptWarehouseEntryService.selectGysptWarehouseEntryById(id);
        
        GysptWarehouseEntryitem item = new GysptWarehouseEntryitem();
        item.setDeleteFlag(1);
        item.setEntryId(id);
        List<GysptWarehouseEntryitem> itemlis = 
        		gysptWarehouseEntryitemService.selectGysptWarehouseEntryitemList(item);
        gysptWarehouseEntry.setItems(itemlis);
        
//        GysptSupply gs = gysptSupplyService.selectGysptSupplyById(gysptWarehouseEntry.getSupplyId().longValue());
//        gysptWarehouseEntry.setSupplyName(gs.getCkdw());
        
        mmap.put("gysptWarehouseEntry", gysptWarehouseEntry);
        
        GysptWarehouse warehouse = 
        		gysptWarehouseService.selectGysptWarehouseById(gysptWarehouseEntry.getWarehouseId());
        mmap.put("warehouse", warehouse);
        return prefix + "/edit";
    }

    /**
     * 修改保存入库单
     */
    @RequiresPermissions("gcgl:entry:edit")
    @Log(title = "入库单", businessType = BusinessType.UPDATE)
    @PostMapping("/edit")
    @ResponseBody
    public AjaxResult editSave(GysptWarehouseEntry gysptWarehouseEntry)
    {
    	gysptWarehouseEntry.setUpdateAt(new Date());
    	gysptWarehouseEntry.setUpdateUser(getLoginName());
        return toAjax(gysptWarehouseEntryService.updateGysptWarehouseEntry(gysptWarehouseEntry));
    }

    /**
     * 删除入库单
     */
    @RequiresPermissions("gcgl:entry:remove")
    @Log(title = "入库单", businessType = BusinessType.DELETE)
    @PostMapping( "/remove")
    @ResponseBody
    public AjaxResult remove(String ids)
    {
        return toAjax(gysptWarehouseEntryService.deleteGysptWarehouseEntryByIds(ids));
    }
    
    @GetMapping("/submaterial")
    public String submaterial(ModelMap mmap){
    	GysptMaterialType gysptMaterialType= new GysptMaterialType();
    	gysptMaterialType.setDeleteFlag(1);
    	List<GysptMaterialType> typelis = gysptMaterialTypeService.selectGysptMaterialTypeList(gysptMaterialType);
    	mmap.put("typelis", typelis);
        return prefix + "/submaterial";
    }
    
    /**
     * 库存数量
     * @param warehouseitem		库存项
     * @param orderId			订单ID
     * @param orderNo			订单编号
     * @param shul				数量
     * @return
     */
    private boolean whlogEntry(GysptWarehouseitem warehouseitem,Long orderId,String orderNo,String shul){
    	boolean flag = true;
    	try {
			GysptWarehouseitemlog warehouseitemlog = new GysptWarehouseitemlog();
    		warehouseitemlog.setWarehouseId(warehouseitem.getWarehouseId());
    		warehouseitemlog.setOrderId(orderId);
    		warehouseitemlog.setOrderNo(orderNo);
			warehouseitemlog.setClbh(warehouseitem.getClbh());
			warehouseitemlog.setClfl(warehouseitem.getClfl());
			warehouseitemlog.setMingc(warehouseitem.getMingc());
			warehouseitemlog.setClpp(warehouseitem.getClpp());
			warehouseitemlog.setGuig(warehouseitem.getGuig());
			warehouseitemlog.setDanw(warehouseitem.getDanw());
			warehouseitemlog.setKucshul(shul);
			warehouseitemlog.setZdjine(warehouseitem.getZdjine());
			warehouseitemlog.setStatus(0);
			warehouseitemlog.setDeleteFlag(1);
			warehouseitemlog.setUpdateUser(getLoginName());
			warehouseitemlog.setUpdateAt(new Date());
			warehouseitemlog.setCreateUser(getLoginName());
			warehouseitemlog.setCreateAt(new Date());
			gysptWarehouseitemlogService.insertGysptWarehouseitemlog(warehouseitemlog);
		} catch (Exception e) {
			e.printStackTrace();
			flag = false;
			return flag;
		}
    	
		return flag;
    }
}